package com.egghiro.j2se.game.scardbattle.model.character.monster;

import com.egghiro.framework.j2se.game.core.SMath;
import com.egghiro.j2se.game.scardbattle.controller.action.ai.MonsterAI;
import com.egghiro.j2se.game.scardbattle.controller.action.ai.RateMonsterAI;
import com.egghiro.j2se.game.scardbattle.model.character.GameCharacter;
import com.egghiro.j2se.game.scardbattle.param.Message;
import com.egghiro.j2se.game.scardbattle.view.console.CardBattleConsoleView;

public class Magician extends Monster {

    public Magician() {
        super("魔法使い", 80, 70, SMath.nextInt(50, 100), SMath.nextInt(100, 200)); // TODO
        // TODO Auto-generated constructor stub
    }

    @Override
    public int magic(GameCharacter target) {
        int monsterAttackPoint = 0;
        this.setMp(this.getMp() - 30); // TODO　魔法の消費MPとダメージ範囲を他のオブジェクト？に保持
        if (this.getMp() < 0) {
            this.setMp(0);
            CardBattleConsoleView.getInstance().showMessage(Message.MSG_MAGIC_START_NG);
        } else {
            monsterAttackPoint = SMath.nextInt(15, 45); // TODO
            target.subtractHp(monsterAttackPoint);
        }

        return monsterAttackPoint;
    }

    @Override
    public int attack(GameCharacter target) {
        int damage = SMath.nextInt(0, 20);
        target.subtractHp(damage);
        return damage;
    }

    // @Override
    // public void act() {
    // // 1～10までの乱数を生成
    // int actNum = SMath.nextInt(1, 10);
    // int monsterAttackPoint = 0;
    //
    // if (actNum >= 1 && actNum <= 5) { // TODO
    // // 50%の確率で魔法攻撃
    // // TODO　攻撃の仕方によって相手を決める
    // System.out.print(this.getName() + Message.MSG_MAGIC_START);
    // monsterAttackPoint = this.magic(this.target());
    // if (monsterAttackPoint > 0) {
    // System.out.println(monsterAttackPoint + Message.MSG_MONSTER_ATTACK_END);
    // }
    // } else {
    // // 通常攻撃
    // monsterAttackPoint = this.attack(this.target());
    // System.out.print(this.getName() + Message.MSG_ATTACK_START);
    // System.out.println(monsterAttackPoint + Message.MSG_MONSTER_ATTACK_END);
    // }
    // }

    @Override
    protected MonsterAI createDefaultAI() {
        // TODO
        return new RateMonsterAI(this) {
            @Override
            public void act() {
                // 1～10までの乱数を生成
                int actNum = SMath.nextInt(1, 10);
                int monsterAttackPoint = 0;

                if (actNum >= 1 && actNum <= 5) { // TODO
                    // 50%の確率で魔法攻撃
                    // TODO　攻撃の仕方によって相手を決める
                    System.out.print(monster.getName() + Message.MSG_MAGIC_START);
                    monsterAttackPoint = monster.magic(monster.target());
                    if (monsterAttackPoint > 0) {
                        System.out.println(monsterAttackPoint + Message.MSG_MONSTER_ATTACK_END);
                    }
                } else {
                    // 通常攻撃
                    monsterAttackPoint = monster.attack(monster.target());
                    System.out.print(monster.getName() + Message.MSG_ATTACK_START);
                    System.out.println(monsterAttackPoint + Message.MSG_MONSTER_ATTACK_END);
                }
            }
        };
    }

}
